<?php

namespace JsonLowCode\UI;

use JsonLowCode\Schema;
use JsonLowCode\Traits\Events\HasModelValueEvent;
use JsonLowCode\Traits\Props\HasClearable;
use JsonLowCode\Traits\Props\HasDefaultValue;
use JsonLowCode\Traits\Props\HasDisabled;
use JsonLowCode\Traits\Props\HasModel;
use JsonLowCode\Traits\Props\HasPlacements;
use JsonLowCode\Traits\Props\HasShow;
use JsonLowCode\Traits\Props\HasSize;
use JsonLowCode\Traits\Props\HasTo;
use JsonLowCode\Traits\Props\HasValue;
use JsonLowCode\Traits\Slots\HasSlotFooter;

/**
 * @method DatePicker make(string $type = 'date')
 */
class DatePicker extends Schema
{
    protected string $componentName = "NDatePicker";

    use HasDefaultValue, HasClearable, HasDisabled, HasShow, HasSize, HasTo, HasValue, HasModel, HasPlacements;

    use HasModelValueEvent;

    use HasSlotFooter;

    /**
     * @param string $type 'date' | 'datetime' | 'daterange' | 'datetimerange' | 'month' | 'monthrange' | 'year' | 'quarter'
     */
    public function __construct(string $type = 'date')
    {
        parent::__construct();
        $this->type($type);
    }

    /**
     * 文本输入的占位符 placeholder
     * @param string|array $placeholder
     * @return $this
     */
    public function placeholder(string|array $placeholder = ''): static
    {
        return $this->prop("placeholder",$placeholder);
    }

    /**
     * 验证状态
     * @param string $value 'success' | 'warning' | 'error'
     * @return $this
     */
    public function status(string $value = 'success' | 'warning' | 'error'): static
    {
        return $this->prop('status', $value);
    }

    /**
     * Date Picker 格式化后默认值 string | [string, string] | null
     * @param string $value
     * @return $this
     */
    public function defaultFormattedValue(string $value): static
    {
        return $this->prop('default-formatted-value', $value);
    }

    /**
     * 格式化之后的值
     * @param string $value string | [string, string] | null
     * @return $this
     */
    public function formattedValue(string $value): static
    {
        return $this->prop('formatted-value', $value);
    }

    /**
     * 格式化
     * @param string $value string
     * @return $this
     */
    public function format(string $value): static
    {
        return $this->prop('format', $value);
    }

    /**
     * 绑定值的格式，详情见
     * @param string $value
     * @return $this
     */
    public function valueFormat(string $value): static
    {
        return $this->prop('value-format', $value);
    }

    /**
     * 日历上一周的开始，0 代表周一
     * @param string|int $value
     * @return $this
     */
    public function firstDayOfWeek(string|int $value = 0 | 1 | 2 | 3 | 4 | 5 | 6): static
    {
        return $this->prop('first-day-of-week', $value);
    }

    /**
     * 设置输入框为只读（避免在移动设备上打开虚拟键盘）
     * @param string|bool $bool
     * @return $this
     */
    public function readonly(string|bool $bool = true): static
    {
        return $this->prop('input-readonly', $bool);
    }

    /**
     * 是否只使用面板
     * @param string|bool $bool
     * @return $this
     */
    public function panel(string|bool $bool = true): static
    {
        return $this->prop('panel', $bool);
    }

    /**
     * 自定义快捷按钮
     * @param string $value Record<string, number | (() => number)> | Record<string, [number, number] | (() => [number, number])>
     * @return $this
     */
    public function shortcuts(string $value): static
    {
        return $this->prop('shortcuts', $value);
    }

    /**
     * Date Picker 的类型
     * @param string $type 'date' | 'datetime' | 'daterange' | 'datetimerange' | 'month' | 'monthrange' | 'year' | 'quarter' | 'quarterrange'
     * @return $this
     */
    public function type(string $type = 'date' | 'datetime' | 'daterange' | 'datetimerange' | 'month' | 'monthrange' | 'year' | 'quarter' | 'quarterrange'): static
    {
        return $this->prop("type",$type);
    }


    /**
     * 用户 confirm 时执行的回调
     * @param string $value (value: number | [number, number] | null, formattedValue: string | [string, string] | null) => void
     * @return $this
     */
    public function onConfirm(string $value = '(value, formattedValue) => void'): static
    {
        return $this->events('on-confirm', $value);
    }

    /**
     * 用户 blur 时执行的回调
     * @param string $value () => void
     * @return $this
     */
    public function onBlur(string $value = '() => {}'): static
    {
        return $this->events('on-blur', $value);
    }

    /**
     * 用户 focus 时执行的回调
     * @param string $value () => void
     * @return $this
     */
    public function onFocus(string $value = '() => {}'): static
    {
        return $this->events('on-focus', $value);
    }

    /**
     * 用户 clear 时执行的回调
     * @param string $value () => void
     * @return $this
     */
    public function onClear(string $value = '() => {}'): static
    {
        return $this->events('on-clear', $value);
    }


    /**
     * 图标
     * @param mixed $value
     * @return $this
     */
    public function slotDateIcon(mixed $value): static
    {
        return $this->slot('date-icon', $value);
    }

    /**
     * 日期范围分隔符号
     * @param mixed $value
     * @return $this
     */
    public function slotSeparator(mixed $value): static
    {
        return $this->slot('separator', $value);
    }

    /**
     * 日期面板的 快速下一个 图标
     * @param mixed $value
     * @return $this
     */
    public function slotNextYear(mixed $value): static
    {
        return $this->slot('next-year', $value);
    }

    /**
     * 日期面板的 下一个 图标
     * @param mixed $value
     * @return $this
     */
    public function slotNextMonth(mixed $value): static
    {
        return $this->slot('next-month', $value);
    }

    /**
     * 日期面板的 快速上一个 图标
     * @param mixed $value
     * @return $this
     */
    public function slotPrevYear(mixed $value): static
    {
        return $this->slot('prev-year', $value);
    }


    /**
     * 日期面板的 上一个 图标
     * @param mixed $value
     * @return $this
     */
    public function slotPrevMonth(mixed $value): static
    {
        return $this->slot('prev-month', $value);
    }
}
